home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 2009 February
/
PCWFEB09.iso
/
Software
/
Resources
/
Chat & Communication
/
Digsby build 37
/
digsby_setup.exe
/
lib
/
dns
/
tokenizer.pyo
(
.txt
)
< prev
next >
Wrap
Python Compiled Bytecode
|
2008-10-13
|
7KB
|
309 lines
# Source Generated with Decompyle++
# File: in.pyo (Python 2.5)
import cStringIO
import sys
import dns.exception as dns
import dns.name as dns
import dns.ttl as dns
_DELIMITERS = {
' ': True,
'\t': True,
'\n': True,
';': True,
'(': True,
')': True,
'"': True }
_QUOTING_DELIMITERS = {
'"': True }
EOF = 0
EOL = 1
WHITESPACE = 2
IDENTIFIER = 3
QUOTED_STRING = 4
COMMENT = 5
DELIMITER = 6
class UngetBufferFull(dns.exception.DNSException):
pass
class Tokenizer(object):
def __init__(self, f = sys.stdin, filename = None):
if isinstance(f, str):
f = cStringIO.StringIO(f)
if filename is None:
filename = '<string>'
elif filename is None:
if f is sys.stdin:
filename = '<stdin>'
else:
filename = '<file>'
self.file = f
self.ungotten_char = None
self.ungotten_token = None
self.multiline = 0
self.quoting = False
self.eof = False
self.delimiters = _DELIMITERS
self.line_number = 1
self.filename = filename
def _get_char(self):
if self.ungotten_char is None:
if self.eof:
c = ''
else:
c = self.file.read(1)
if c == '':
self.eof = True
elif c == '\n':
self.line_number += 1
else:
c = self.ungotten_char
self.ungotten_char = None
return c
def where(self):
return (self.filename, self.line_number)
def _unget_char(self, c):
if self.ungotten_char is not None:
raise UngetBufferFull
self.ungotten_char = c
def skip_whitespace(self):
skipped = 0
while True:
c = self._get_char()
if c != ' ' and c != '\t':
if c != '\n' or not (self.multiline):
self._unget_char(c)
return skipped
skipped += 1
def get(self, want_leading = False, want_comment = False):
if self.ungotten_token is not None:
token = self.ungotten_token
self.ungotten_token = None
if token[0] == WHITESPACE:
if want_leading:
return token
elif token[0] == COMMENT:
if want_comment:
return token
else:
return token
skipped = self.skip_whitespace()
if want_leading and skipped > 0:
return (WHITESPACE, ' ')
token = ''
ttype = IDENTIFIER
while True:
c = self._get_char()
if c == '' or c in self.delimiters:
if c == '' and self.quoting:
raise dns.exception.UnexpectedEnd
if token == '' and ttype != QUOTED_STRING:
if c == '(':
self.multiline += 1
self.skip_whitespace()
continue
elif c == ')':
if not self.multiline > 0:
raise dns.exception.SyntaxError
self.multiline -= 1
self.skip_whitespace()
continue
elif c == '"':
if not self.quoting:
self.quoting = True
self.delimiters = _QUOTING_DELIMITERS
ttype = QUOTED_STRING
continue
else:
self.quoting = False
self.delimiters = _DELIMITERS
self.skip_whitespace()
elif c == '\n':
return (EOL, '\n')
elif c == ';':
while None:
c = self._get_char()
if c == '\n' or c == '':
break
token += c
continue
if want_comment:
self._unget_char(c)
return (COMMENT, token)
elif c == '':
if self.multiline:
raise dns.exception.SyntaxError, 'unbalanced parentheses'
return (EOF, '')
elif self.multiline:
self.skip_whitespace()
token = ''
continue
else:
return (EOL, '\n')
want_comment
token = c
ttype = DELIMITER
else:
self._unget_char(c)
break
elif self.quoting:
if c == '\\':
c = self._get_char()
if c == '':
raise dns.exception.UnexpectedEnd
if c.isdigit():
c2 = self._get_char()
if c2 == '':
raise dns.exception.UnexpectedEnd
c3 = self._get_char()
if c == '':
raise dns.exception.UnexpectedEnd
if not c2.isdigit() and c3.isdigit():
raise dns.exception.SyntaxError
c = chr(int(c) * 100 + int(c2) * 10 + int(c3))
elif c == '\n':
raise dns.exception.SyntaxError, 'newline in quoted string'
elif c == '\\':
c = self._get_char()
if c == '' or c not in self.delimiters:
self._unget_char(c)
c = '\\'
token += c
if token == '' and ttype != QUOTED_STRING:
if self.multiline:
raise dns.exception.SyntaxError, 'unbalanced parentheses'
ttype = EOF
return (ttype, token)
def unget(self, token):
if self.ungotten_token is not None:
raise UngetBufferFull
self.ungotten_token = token
def next(self):
token = self.get()
if token[0] == EOF:
raise StopIteration
return token
def __iter__(self):
return self
def get_int(self):
(ttype, value) = self.get()
if ttype != IDENTIFIER:
raise dns.exception.SyntaxError, 'expecting an identifier'
if not value.isdigit():
raise dns.exception.SyntaxError, 'expecting an integer'
return int(value)
def get_uint8(self):
value = self.get_int()
if value < 0 or value > 255:
raise dns.exception.SyntaxError, '%d is not an unsigned 8-bit integer' % value
return value
def get_uint16(self):
value = self.get_int()
if value < 0 or value > 65535:
raise dns.exception.SyntaxError, '%d is not an unsigned 16-bit integer' % value
return value
def get_uint32(self):
(ttype, value) = self.get()
if ttype != IDENTIFIER:
raise dns.exception.SyntaxError, 'expecting an identifier'
if not value.isdigit():
raise dns.exception.SyntaxError, 'expecting an integer'
value = long(value)
if value < 0 or value > 0x100000000L:
raise dns.exception.SyntaxError, '%d is not an unsigned 32-bit integer' % value
return value
def get_string(self, origin = None):
(ttype, t) = self.get()
if ttype != IDENTIFIER and ttype != QUOTED_STRING:
raise dns.exception.SyntaxError, 'expecting a string'
return t
def get_name(self, origin = None):
(ttype, t) = self.get()
if ttype != IDENTIFIER:
raise dns.exception.SyntaxError, 'expecting an identifier'
return dns.name.from_text(t, origin)
def get_eol(self):
(ttype, t) = self.get()
if ttype != EOL and ttype != EOF:
raise dns.exception.SyntaxError, 'expected EOL or EOF, got %d "%s"' % (ttype, t)
return t
def get_ttl(self):
(ttype, t) = self.get()
if ttype != IDENTIFIER:
raise dns.exception.SyntaxError, 'expecting an identifier'
return dns.ttl.from_text(t)